<--- %%NOBANNER%% --> debracket.sas
 BackForward
/* %put %debracket(); */
%macro debracket(string);
%local _unbrktstr_;
%let _unbrktstr_=&string; 
%if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_unbrktstr_))))), %str(%()) and 
%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_unbrktstr_))))), %str(%)))) %then %do;
   %if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_unbrktstr_))))), %str(%()) ge 2) %then %do;
      %let _unbrktstr_=%substr(%bquote(&string), 1, 
      %eval(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&string))))), %str(%())-1))%substr(%bquote(&string), 
      %eval(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&string))))), %str(%())+1), 
      %eval(%length(&string)-%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&string))))), %str(%())));
   %end;
   %else %do;
      %let _unbrktstr_=%substr(%bquote(&string), 
      %eval(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&string))))), %str(%())+1), %eval(%length(&string)-%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&string))))), %str(%())));
   %end;
   %if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_unbrktstr_))))), %str(%()) and 
   	 %index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_unbrktstr_))))), %str(%)))) and 
       (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_unbrktstr_))))), %str(%()) lt 
       %index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_unbrktstr_))))), %str(%)))) %then %do;
      %if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), %str(%))) 
      	  ge 2) %then %do;
         %let _unbrktstr_=%sysfunc(reverse(%bquote(%substr(%bquote(%sysfunc(reverse(%bquote(&_unbrktstr_)))), 1, 
         %eval(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), 
         %str(%)))-1))%substr(%bquote(%sysfunc(reverse(%bquote(&_unbrktstr_)))), 
         %eval(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), 
         %str(%)))+1), %eval(%length(%bquote(%sysfunc(reverse(%bquote(&_unbrktstr_)))))-
         %index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), 
         %str(%))))))));
      %end;
      %else %do;
         %let _unbrktstr_=%sysfunc(reverse(%bquote(%substr(%bquote(%sysfunc(reverse(%bquote(&_unbrktstr_)))), 
         %eval(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), 
         %str(%)))+1), %eval(%length(%bquote(%sysfunc(reverse(%bquote(&_unbrktstr_)))))-
         %index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), 
         %str(%))))))));
      %end;
   %end;
   %else %do;
      %if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), %str(%))) 
      	  ge 2) %then %do;
         %let _unbrktstr_=%sysfunc(reverse(%bquote(%substr(%bquote(%sysfunc(reverse(%bquote(&_unbrktstr_)))), 1,
         %eval(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), 
         %str(%)))-1))%substr(%bquote(%sysfunc(reverse(%bquote(&_unbrktstr_)))), 
         %eval(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), 
         %str(%)))+1), %eval(%length(%bquote(%sysfunc(reverse(%bquote(&_unbrktstr_)))))-
         %index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), 
         %str(%))))))));
      %end;
      %else %do;
         %let _unbrktstr_=%sysfunc(reverse(%bquote(%substr(%bquote(%sysfunc(reverse(%bquote(&_unbrktstr_)))), 
         %eval(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), 
         %str(%)))+1), %eval(%length(%bquote(%sysfunc(reverse(%bquote(&_unbrktstr_)))))-
         %index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(%bquote(&_unbrktstr_)))))))), 
         %str(%))))))));
      %end;
   %end;
%end; &_unbrktstr_ %put;
%mend debracket;